一旦將網站對外,就要開始面對這個險惡的世界每天遭受一堆攻擊,雖然大部分都無關痛癢,幾乎都是機器人在 scan ip 然後在發一些無意義的請求,或者亂試 api,看能不能試出來...,最好是哪麼好試啦,而且加上我們之前在 JWT 篇章講到的 protected point 技術,request 必須帶上有效的 token 才能使用 api,要成功使用我們的後端,難度已經很高了
儘管如此,每天被這樣騷擾,還是很煩。那怎麼辦呢?那我們可以做到擋 ip 直連,client 要使用我們的服務,一定要走 DNS,DNS 本身就是一種保護,在網域供應商這邊應該是要做到一些安全防護,再轉到我們的 server
首先我們進到 nginx/sites-available
,打開其中一個網站的設定,然後在原有的網站設定下加入以下內容
server {
listen 80 default;
server_name _;
return 403;
}
server {
listen 443 ssl default;
server_name _;
ssl_certificate /etc/letsencrypt/live/your_domain_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain_name/privkey.pem;
return 403;
}
listen 80 default
是說 80 port 預設會先走這,然後 server_name _
是說 server_name
等於任何 ip,最後 return 403
,回 403 Forbidden 不讓別人連線,所以別人連我們 server 的 ip 就會被擋下來了,下面的 https server 設定也是一樣
最後要解決一個很傻的問題,我之前覺得奇怪,為什麼我在根路由以外的頁面刷新頁面,網站都會回我 404,可是我在網站內點來點去,進不同頁面都很順利啊,是為什麼呢?
後來我才發現 server
設定內不能只定義 location /
要進到哪個頁面,如果要進入任何頁面都沒問題,要設定如下
server{
listen 443 ssl http2;
server_name your_domain_name;
ssl_certificate /etc/letsencrypt/live/your_domain_name/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain_name/privkey.pem;
location / {
root path_of_web_bundle;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
location /
內最後要設定 try_files $uri $uri/ /index.html;
,nginx 才會套用網頁專案內定義的路由表